/**
 * 通用工具函数库
 * @description 提供日期格式化、数据验证等通用功能
 * @author 系统重构
 * @date 2023-10-01
 */

/**
 * 日期格式化
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @param {string} format - 格式化模板，如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
function formatDate(date, format = 'YYYY-MM-DD') {
  if (!date) {
    return '';
  }
  
  let dateObj = date;
  if (typeof date === 'string' || typeof date === 'number') {
    dateObj = new Date(date);
  }
  
  if (!(dateObj instanceof Date) || isNaN(dateObj)) {
    return '';
  }
  
  const year = dateObj.getFullYear();
  const month = dateObj.getMonth() + 1;
  const day = dateObj.getDate();
  const hour = dateObj.getHours();
  const minute = dateObj.getMinutes();
  const second = dateObj.getSeconds();
  
  const padZero = (num) => {
    return num < 10 ? '0' + num : num;
  };
  
  return format
    .replace(/YYYY/g, year)
    .replace(/MM/g, padZero(month))
    .replace(/DD/g, padZero(day))
    .replace(/HH/g, padZero(hour))
    .replace(/mm/g, padZero(minute))
    .replace(/ss/g, padZero(second));
}

/**
 * 将对象转为URL参数字符串
 * @param {Object} obj - 要转换的对象
 * @returns {string} URL参数字符串
 */
function objectToParams(obj) {
  if (!obj || typeof obj !== 'object') {
    return '';
  }
  
  const params = [];
  
  for (const key in obj) {
    if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) {
      params.push(`${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`);
    }
  }
  
  return params.join('&');
}

/**
 * 从URL参数字符串解析对象
 * @param {string} paramStr - URL参数字符串
 * @returns {Object} 解析后的对象
 */
function paramsToObject(paramStr) {
  if (!paramStr || typeof paramStr !== 'string') {
    return {};
  }
  
  const result = {};
  const params = paramStr.split('&');
  
  for (const param of params) {
    const pair = param.split('=');
    if (pair.length === 2) {
      const key = decodeURIComponent(pair[0]);
      const value = decodeURIComponent(pair[1]);
      result[key] = value;
    }
  }
  
  return result;
}

/**
 * 限制字符串长度，超出部分用省略号替代
 * @param {string} str - 原始字符串
 * @param {number} maxLength - 最大长度
 * @returns {string} 处理后的字符串
 */
function truncateString(str, maxLength = 10) {
  if (!str || str.length <= maxLength) {
    return str || '';
  }
  
  return str.slice(0, maxLength) + '...';
}

/**
 * 校验手机号
 * @param {string} phone - 手机号
 * @returns {boolean} 是否有效
 */
function isValidPhone(phone) {
  if (!phone || typeof phone !== 'string') {
    return false;
  }
  
  const phoneReg = /^1[3-9]\d{9}$/;
  return phoneReg.test(phone);
}

/**
 * 校验邮箱
 * @param {string} email - 邮箱
 * @returns {boolean} 是否有效
 */
function isValidEmail(email) {
  if (!email || typeof email !== 'string') {
    return false;
  }
  
  const emailReg = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
  return emailReg.test(email);
}

/**
 * 获取文件扩展名
 * @param {string} filename - 文件名
 * @returns {string} 扩展名（不含点号）
 */
function getFileExtension(filename) {
  if (!filename || typeof filename !== 'string') {
    return '';
  }
  
  const parts = filename.split('.');
  if (parts.length === 1) {
    return '';
  }
  
  return parts[parts.length - 1].toLowerCase();
}

/**
 * 深拷贝对象
 * @param {*} obj - 要拷贝的对象
 * @returns {*} 拷贝后的对象
 */
function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }
  
  if (obj instanceof Date) {
    return new Date(obj.getTime());
  }
  
  if (obj instanceof Array) {
    return obj.map(item => deepClone(item));
  }
  
  if (obj instanceof Object) {
    const copy = {};
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        copy[key] = deepClone(obj[key]);
      }
    }
    return copy;
  }
  
  return obj;
}

/**
 * 休眠函数
 * @param {number} ms - 休眠时间（毫秒）
 * @returns {Promise} Promise对象
 */
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

/**
 * 生成指定范围内的随机整数
 * @param {number} min - 最小值（含）
 * @param {number} max - 最大值（含）
 * @returns {number} 随机整数
 */
function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

// 导出所有函数
module.exports = {
  formatDate,
  objectToParams,
  paramsToObject,
  truncateString,
  isValidPhone,
  isValidEmail,
  getFileExtension,
  deepClone,
  sleep,
  randomInt
}; 